/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package blink.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * Modélise une cible qui apparaîtera dans les essais générés à partir de la 
 * tache à laquelle elle associée. 
 * Une cible est répsentée par un nom, une probabilité d'appariton , un ensemble de 
 * positions possibles dans les essais générés, sont type : detectée 
 * (detected true) ou identifiée (detected=false), la liste des stimulis possibles, 
 * et une question qui sera posée à l'utilisateur à la fin de chaque essai généré. 
 * 
 * @author jerome
 */
public class Target implements Serializable {
    
    private String name;      // nom de la cible
    private double probability;   //proba d'apparition 
    private int[] possiblePositions;  //positon de la cible 
    private List<Stimulus> possibleTargets;  //possible stimulus
    private Task task;
    
    private boolean detected=true; //type de cible true=identifie + false = a identifier
    
    private String question; //question pose a l utilisateur

    public Target(String name, Task t) {
        setName(name);
        probability=0.5;
        detected=true;
        possibleTargets=new ArrayList<Stimulus>();
        possiblePositions=new int[]{0};
        if (detected)
            question="As-tu vu une des images ci-dessous ?";
        else 
             question="Parmi les images ci-dessous, laquelle as-tu vu ?";
        t.addTarget(this);
        task=t;
        
        
    }


    public int[] getPossiblePositions() {
        return possiblePositions;
    }

    public void setPossiblePositions(int[] possiblePositions) {
        if (possiblePositions==null || possiblePositions.length==0) {
            throw new RuntimeException("Sequence length cannot be empty");
        }
        else {
            int minTaskLength=Integer.MAX_VALUE;
            for (int l : task.getPossibleSequenceLengths()) {
                if (l<minTaskLength) minTaskLength=l;
            }
            for (int i : possiblePositions)
             if (i<0)
                 throw new RuntimeException("Possible position cannot be negative");
             else if (i>=minTaskLength)
                 throw new RuntimeException("Possible position cannot be greater than or equals to the minimal length of the task");
        }
        this.possiblePositions = possiblePositions;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name==null || name.matches("^ *$")) {
            throw new RuntimeException("The name cannot be empty");
        }
        this.name = name;
    }

    public double getProbability() {
        return probability;
    }

    public void setProbability(double probability) {
        if (probability<=0 || probability>1) {
            throw new RuntimeException("The probability have to be greater than 0 and less than or equals to 1");
        }
        this.probability = probability;
    }

    public List<Stimulus> getPossibleTargets() {
        return possibleTargets;
    }

    public boolean isDetected() {
        return detected;
    }

    public void setDetected(boolean detected) {
        this.detected = detected;
    }
    
    public boolean isIdentified() {
        return !detected;
    }
    

    public String getQuestion() {
        return question;
    }

    public void setQuestion(String question) {
        if (question==null || question.matches("^ *$")) {
            throw new RuntimeException("Question cannot be empty");
        }
        this.question = question;
    } 
    
    @Override
    public String toString() {
        return this.getName();
    }
}
